#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import json
import subprocess
import sys
import os
from datetime import datetime

import cv2
import time
from concurrent.futures import ThreadPoolExecutor


"""
1、指定输入文件夹、输出文件夹，批量处理文件
2、调用命令行
3、先扫描出文件，再执行操作并输出
"""


# 递归扫描文件进行处理
def recursive(path, file_list, pix):
    listdir = os.listdir(path)
    for dir_name in listdir:
        if dir_name != ".DS_Store":
            # print("路径：", path + "/" + dir_name)
            if os.path.isdir(path + "/" + dir_name):
                print("目录：", path + "/" + dir_name)
                # 是目录就继续扫描
                recursive(path + "/" + dir_name, file_list, pix)
            else:
                if dir_name.endswith(".ts") or dir_name.endswith(".mp4") or dir_name.endswith(".mpeg") or dir_name.endswith(".avi"):
                    print("文件：", path + "/" + dir_name)
                    # ffprobe -i /Users/hubert/Downloads/视频测试/6F5C899975164C19B602A8A992FA3169.ts -v quiet -of json -show_streams -select_streams v:0
                    file_path = path + "/" + dir_name
                    base_cmd = "ffprobe -i " + "\"" + file_path + "\"" + " -v quiet -of json -show_streams -select_streams v:0"
                    try:
                        json_str = popen_(base_cmd)
                        json_streams = json.loads(json_str)
                        v_width = json_streams["streams"][0]["width"]
                        v_height = json_streams["streams"][0]["height"]

                        # 处理1080P视频 "1920*1080"
                        if pix == str(v_width)+"*"+str(v_height):
                            # print(str(v_width)+"*"+str(v_height))
                            file_list.append(path + "/" + dir_name)
                        else:
                            print("没有匹配到所需要的处理的视频文件，请检查视频或输入的分辨率参数！！！")
                    except Exception as ex:
                        print('str(ex):\t\t', str(ex))


# 调用命令行
def popen_(command):
    val = os.popen(command).read()
    return val


def exe_video(file_list):
    # ffmpeg -i input -vf "delogo=x=1600:y=50:w=210:h=60" -c:v h264 -level 4.1 -b:v 7500k -c:a copy -y ouput
    base_cmd = "ffmpeg -i "
    """
        GPU：
            MAC： h264_videotoolbox
            windows： h264_nvenc
    """

    if len(file_list) > 0:
        for filename in file_list:
            ouput_file_path = output_path + "/" + datetime.now().strftime('%Y%m%d')
            if not os.path.exists(ouput_file_path):
                os.makedirs(ouput_file_path)
            ouput_file = ouput_file_path + "/"+os.path.basename(filename)
            exe_cmd = base_cmd + "\"" + filename + "\"" + " -vf delogo=x=" + str(delogo_x) + ":y=" + str(delogo_y) + ":w=" \
                      + str(delogo_w) + ":h=" + str(delogo_h) + " " + "-c:v h264_videotoolbox" + " " + "-b:v " + str(v_bitrate) \
                      + " -c:a copy -y " + "\"" + ouput_file + "\""
            print(exe_cmd)
            val = popen_(exe_cmd)
            # 出差执行过程
            print(val)
            # 分割线
            print("************************************************************************************************")


# 主程序
if __name__ == '__main__':
    # print(sys.argv)
    # sys.argv 参数接收从1开始
    # python py_file_list.py input output
    # 第二参数：输入目录
    # print(sys.argv[1])
    # 第三个参数：输出目录
    # print(sys.argv[2])
    # if len(sys.argv) < 2:
    """
        # print("参数输入不合理：", "ffmpeg -i input -vf \"delogo=x=1600:y=50:w=210:h=60\" -c:v h264_nvenc -b:v 7500k -c:a copy -y ouput")
        扫描目录为：D:/test/video_src
        输出目录为：E:/test/video_tag
        delogo_x坐标：134
        delogo_y坐标：65
        delogo_w高度：30
        delogo_h高度：20
        视频输出码率：5000k
        匹配的视频分辨率：1920*1080
    """
    print("************ example：***************" + "\n"
          "扫描目录为：D:/test/video_src" + "\n"
          "输出目录为：E:/test/video_tag" + "\n"
          "delogo_x坐标：134" + "\n"
          "delogo_y坐标：65" + "\n"
          "delogo_w宽度：30" + "\n"
          "delogo_h高度：20" + "\n"
          "视频输出码率：5000k" + "\n"
          "匹配的视频分辨率：1920*1080" + "\n"
          "************************************")
    input_path = input("请输入扫描目录（例如：D:/test/video_src）：")
    print("扫描目录为：", input_path)
    output_path = input("请输入输出目录(例如：E:/test/video_tag)：")
    print("输出目录为：", output_path)
    delogo_x = input("请输入delogo_x坐标（例如：134）：")
    print("delogo_x坐标：", delogo_x)
    delogo_y = input("请输入delogo_y坐标（例如：65）：")
    print("delogo_y坐标：", delogo_y)
    delogo_w = input("请输入delogo_w宽度（例如：30）：")
    print("delogo_w宽度：", delogo_w)
    delogo_h = input("请输入delogo_h高度（例如：20）：")
    print("delogo_h高度：", delogo_h)
    v_bitrate = input("请输入视频输出码率(例如：5000k)：")
    print("视频输出码率：", v_bitrate)
    pix = input("请输入需匹配的视频分辨率（例如：1920*1080）：")
    print("匹配的视频分辨率：", pix)

    file_list = []
    # 递归扫描目录
    recursive(input_path, file_list, pix)
    # 根据获取的文件列表按序执行
    exe_video(file_list)




